#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <time.h>

#define ERREUR(msg)		printf ("Erreur [%s:%d] : ", __FILE__, __LINE__);printf(msg);printf("\n");
#define ERREUR2(msg,params)	printf ("Erreur [%s:%d] : ", __FILE__, __LINE__);printf(msg,params);printf("\n");


int main( int argc, char *argv[] ){

	int fichier=0, i, pigeons, pigeonniers, j;

	/* Si il y a un argument -h ou plus d'un */
	if( argc<2 || !strcmp(argv[1],"-h") ){

		printf("\nUsage:\n");
		printf("\t%s <Nombre de pigeons> [fichier de formules de cardinalite]\n", argv[0]);
		printf("Si aucun fichier est specifie on ecrit les formules dans la sortie standard\n");

		return 0;

	/* Si un fichier est specifie */
	}else if(argc>=3){

		/* on remplace l'entree standard par le fichier */
		if( (fichier = open(argv[2], O_WRONLY| O_CREAT, S_IRUSR|S_IWUSR )) == -1 ){

			ERREUR2("Ne peut creer le fichier \"%s\"", argv[3]);
			return 0;

		}

		if( dup2( fichier, fileno(stdout) ) == -1 ){

			ERREUR2("Ne peut rediriger le flux de \"%s\"", argv[3]);
			return 0;

		}
	
	}
	// tailles
	pigeons = atoi(argv[1]);
	pigeonniers = pigeons - 1;

	if( pigeons < 2 ){
		printf("0 0\n");
		exit(0);
	}
	
	// generation
	printf("%i %i\n", pigeons + pigeonniers, pigeons*pigeonniers );

	// pigeons
	for( i=0; i<pigeons; i++ ){

		printf("( 1, { ");

		// dans 1 pigeonnier
		for( j=0; j<pigeonniers-1; j++ ){

			printf("%i, ", (pigeonniers*i)+j+1 );

		}
		printf("%i ", (pigeonniers*i)+j+1 );
		printf("} )\n");

	}

	// pigeonniers
	for( i=0; i<pigeonniers; i++ ){

		printf("( %i, { ", pigeons-1);

		// au plus 1 pigeon
		for( j=0; j<pigeons-1; j++ ){

			printf("-%i, ", (j*pigeonniers)+i+1 );

		}
		printf("-%i ", (j*pigeonniers)+i+1 );
		printf("} )\n");

	}

	// deverouillage du fichier
	close( fichier );
	
	return 0;
}

